home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2008 February / PCWFEB08.iso / Software / Freeware / Miro 1.0 / Miro_Installer.exe / Miro_Downloader.exe / test / unicodetest.pyc (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2007-11-12  |  19.4 KB  |  357 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.5)
  3.  
  4. import unittest
  5. from tempfile import mkstemp
  6. from time import sleep
  7. import time
  8. import types
  9. import feed
  10. import item
  11. import database
  12. import feedparser
  13. import app
  14. import dialogs
  15. import framework
  16. import os
  17. import gtcache
  18. import gettext
  19. import resources
  20. import template
  21. import util
  22. from template_compiler import TemplateError
  23. import template_compiler
  24. from test.framework import DemocracyTestCase
  25.  
  26. class UnicodeTestDelegate:
  27.     
  28.     def __init__(self):
  29.         self.choice = None
  30.         self.numCalls = 0
  31.  
  32.     
  33.     def runDialog(self, dialog):
  34.         self.numCalls += 1
  35.         dialog.choice = self.choice
  36.         dialog.callback(dialog)
  37.  
  38.  
  39.  
  40. class UnicodeFeedTestCase(framework.EventLoopTest):
  41.     
  42.     def setUp(self):
  43.         super(UnicodeFeedTestCase, self).setUp()
  44.  
  45.     
  46.     def isProperFeedParserDict(self, parsed, name = 'top'):
  47.         if isinstance(parsed, types.DictionaryType):
  48.             for key, value in parsed.items():
  49.                 self.isProperFeedParserDict(value, key)
  50.             
  51.         elif isinstance(parsed, types.ListType) or isinstance(parsed, types.TupleType):
  52.             for value in parsed:
  53.                 self.isProperFeedParserDict(value, name)
  54.             
  55.         elif isinstance(parsed, types.StringType):
  56.             self.assert_(name in ('base', 'type', 'encoding', 'version', 'href', 'rel'))
  57.         elif isinstance(parsed, time.struct_time):
  58.             self.assert_(name in ('updated_parsed',))
  59.         elif isinstance(parsed, types.IntType):
  60.             self.assert_(name in ('bozo',))
  61.         elif not isinstance(parsed, types.UnicodeType):
  62.             pass
  63.         self.assert_(isinstance(parsed, types.NoneType))
  64.  
  65.     
  66.     def isASCIIUnicode(self, value):
  67.         if type(value) == types.UnicodeType:
  68.             pass
  69.         return value == value.encode('ascii')
  70.  
  71.     
  72.     def testValidUTF8Feed(self):
  73.         (handle, self.filename) = mkstemp('.xml')
  74.         handle = file(self.filename, 'wb')
  75.         handle.write(u'<?xml version="1.0"?>\n<rss version="2.0">\n   <channel>\n <title>Chinese Numbers ΓùïΣ╕ÇΣ║îΣ╕ëσ¢¢Σ║öσà¡Σ╕âσà½Σ╣¥</title>\n      <description>Chinese Numbers ΓùïΣ╕ÇΣ║îΣ╕ëσ¢¢Σ║öσà¡Σ╕âσà½Σ╣¥</description>\n      <language>zh-zh</language>\n     <pubDate>Fri, 25 Aug 2006 17:39:21 GMT</pubDate>\n      <generator>Weblog Editor 2.0</generator>\n      <managingEditor>editor@example.com</managingEditor>\n      <webMaster>webmaster@example.com</webMaster>\n      <item>\n\n         <title>ΓùïΣ╕ÇΣ║îΣ╕ëσ¢¢Σ║öσà¡Σ╕âσà½Σ╣¥</title>\n     <link>http://participatoryculture.org/boguslink</link>\n         <description>ΓùïΣ╕ÇΣ║îΣ╕ëσ¢¢Σ║öσà¡Σ╕âσà½Σ╣¥</description>\n        <enclosure url="file://crap" length="0" type="video/mpeg"/>\n         <pubDate>Fri, 25 Aug 2006 17:39:21 GMT</pubDate>\n      </item>\n   </channel>\n</rss>'.encode('utf-8'))
  76.         handle.close()
  77.         myFeed = feed.Feed(u'file://' + self.filename)
  78.         self.forceFeedParserCallback(myFeed)
  79.         self.isProperFeedParserDict(myFeed.parsed)
  80.         self.assertEqual(type(myFeed.getTitle()), types.UnicodeType)
  81.         self.assertEqual(u'Chinese Numbers ΓùïΣ╕ÇΣ║îΣ╕ëσ¢¢Σ║öσà¡Σ╕âσà½Σ╣¥', myFeed.getTitle())
  82.         self.assertEqual(type(myFeed.getDescription()), types.UnicodeType)
  83.         self.assertEqual(u'<span>Chinese Numbers ΓùïΣ╕ÇΣ║îΣ╕ëσ¢¢Σ║öσà¡Σ╕âσà½Σ╣¥</span>', myFeed.getDescription())
  84.         items = database.defaultDatabase.filter((lambda x: x.__class__ == item.Item))
  85.         self.assertEqual(items.len(), 1)
  86.         i = items[0]
  87.         self.assertEqual(type(i.getTitle()), types.UnicodeType)
  88.         self.assertEqual(u'ΓùïΣ╕ÇΣ║îΣ╕ëσ¢¢Σ║öσà¡Σ╕âσà½Σ╣¥', i.getTitle())
  89.         self.assertEqual(type(i.getDescription()), types.UnicodeType)
  90.         self.assertEqual(u'<span>ΓùïΣ╕ÇΣ║îΣ╕ëσ¢¢Σ║öσà¡Σ╕âσà½Σ╣¥</span>', i.getDescription())
  91.  
  92.     
  93.     def forceFeedParserCallback(self, myFeed):
  94.         myFeed.feedparser_callback(feedparser.parse(myFeed.initialHTML))
  95.  
  96.     
  97.     def testInvalidLatin1Feed(self):
  98.         (handle, self.filename) = mkstemp('.xml')
  99.         handle = file(self.filename, 'wb')
  100.         handle.write('<?xml version="1.0"?>\n<rss version="2.0">\n   <channel>\n      <title>H\xe4ppy Birthday</title>\n      <description>H\xe4ppy Birthday</description>\n <language>zh-zh</language>\n      <pubDate>Fri, 25 Aug 2006 17:39:21 GMT</pubDate>\n      <generator>Weblog Editor 2.0</generator>\n      <managingEditor>editor@example.com</managingEditor>\n      <webMaster>webmaster@example.com</webMaster>\n      <item>\n         <title>H\xe4ppy Birthday</title>\n         <link>http://participatoryculture.org/boguslink</link>\n         <description>H\xe4ppy Birthday</description>\n         <enclosure url="file://crap" length="0" type="video/mpeg"/>\n         <pubDate>Fri, 25 Aug 2006 17:39:21 GMT</pubDate>\n      </item>\n   </channel>\n</rss>')
  101.         handle.close()
  102.         dialogs.delegate = UnicodeTestDelegate()
  103.         dialogs.delegate.choice = dialogs.BUTTON_YES
  104.         myFeed = feed.Feed(u'file://' + self.filename)
  105.         myFeed.update()
  106.         self.processThreads()
  107.         self.processIdles()
  108.         self.assertEqual(len(myFeed.items), 1)
  109.         myItem = myFeed.items[0]
  110.         self.assertEqual(len(myItem.getTitle()), 14)
  111.         self.assertEqual(myItem.getTitle(), u'H├ñppy Birthday')
  112.  
  113.     
  114.     def testLatin1HTML(self):
  115.         (handle, self.filename) = mkstemp('.html')
  116.         handle = file(self.filename, 'wb')
  117.         handle.write('<?xml version="1.0" encoding="iso-8859-1"?>\n<html>\n   <head>\n       <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />\n  <title>H\xe4ppy Birthday</title>\n   </head>\n   <body>\n   <a href="http://www.wccatv.com/files/video/hbml.mov">H\xe4ppy Birthday</a>\n   </body>\n</html>')
  118.         handle.close()
  119.         dialogs.delegate = UnicodeTestDelegate()
  120.         dialogs.delegate.choice = dialogs.BUTTON_YES
  121.         myFeed = feed.Feed(u'file://' + self.filename)
  122.         self.assertEqual(dialogs.delegate.numCalls, 1)
  123.         myFeed.update()
  124.         self.assertEqual(len(myFeed.items), 1)
  125.         myItem = myFeed.items[0]
  126.         self.assertEqual(len(myItem.getTitle()), 14)
  127.         self.assertEqual(myItem.getTitle(), u'H├ñppy Birthday')
  128.  
  129.     
  130.     def testInvalidLatin1HTML(self):
  131.         (handle, self.filename) = mkstemp('.html')
  132.         handle = file(self.filename, 'wb')
  133.         handle.write('<?xml version="1.0" encoding="utf-8"?>\n<html>\n   <head>\n       <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />\n      <title>H\xe4ppy Birthday</title>\n   </head>\n   <body>\n   <a href="http://www.wccatv.com/files/video/hbml.mov">H\xe4ppy Birthday</a>\n   </body>\n</html>')
  134.         handle.close()
  135.         dialogs.delegate = UnicodeTestDelegate()
  136.         dialogs.delegate.choice = dialogs.BUTTON_YES
  137.         myFeed = feed.Feed(u'file://' + self.filename)
  138.         self.assertEqual(dialogs.delegate.numCalls, 1)
  139.         myFeed.update()
  140.         self.assertEqual(len(myFeed.items), 1)
  141.         myItem = myFeed.items[0]
  142.         self.assertEqual(len(myItem.getTitle()), 14)
  143.         self.assertEqual(myItem.getTitle(), u'H├ñppy Birthday')
  144.  
  145.     
  146.     def testUTF8HTML(self):
  147.         (handle, self.filename) = mkstemp('.html')
  148.         handle = file(self.filename, 'wb')
  149.         handle.write('<?xml version="1.0" encoding="utf-8"?>\n<html>\n   <head>\n       <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />\n      <title>H\xc3\xa4ppy Birthday</title>\n   </head>\n   <body>\n   <a href="http://www.wccatv.com/files/video/hbml.mov">H\xc3\xa4ppy Birthday</a>\n   </body>\n</html>')
  150.         handle.close()
  151.         dialogs.delegate = UnicodeTestDelegate()
  152.         dialogs.delegate.choice = dialogs.BUTTON_YES
  153.         myFeed = feed.Feed(u'file://' + self.filename)
  154.         self.assertEqual(dialogs.delegate.numCalls, 1)
  155.         myFeed.update()
  156.         self.assertEqual(len(myFeed.items), 1)
  157.         myItem = myFeed.items[0]
  158.         self.assertEqual(len(myItem.getTitle()), 14)
  159.         self.assertEqual(myItem.getTitle(), u'H├ñppy Birthday')
  160.  
  161.     
  162.     def testUTF8HTMLLinks(self):
  163.         (handle, self.filename) = mkstemp('.html')
  164.         handle = file(self.filename, 'wb')
  165.         handle.write('<?xml version="1.0" encoding="utf-8"?>\n<html>\n   <head>\n       <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />\n      <title>H\xc3\xa4ppy Birthday</title>\n   </head>\n   <body>\n   <a href="http://www.wccatv.com/files/video/H\xc3\xa4ppy.mov">H\xc3\xa4ppy Birthday</a>\n   </body>\n</html>')
  166.         handle.close()
  167.         dialogs.delegate = UnicodeTestDelegate()
  168.         dialogs.delegate.choice = dialogs.BUTTON_YES
  169.         myFeed = feed.Feed(u'file://' + self.filename)
  170.         self.assertEqual(dialogs.delegate.numCalls, 1)
  171.         myFeed.update()
  172.         if len(myFeed.items) > 0:
  173.             self.assertEqual(len(myFeed.items), 1)
  174.             myItem = myFeed.items[0]
  175.             myURL = myItem.getURL()
  176.             self.assertEqual(str(myURL), myURL)
  177.         
  178.  
  179.     
  180.     def testLatin1HTMLLinks(self):
  181.         (handle, self.filename) = mkstemp('.html')
  182.         handle = file(self.filename, 'wb')
  183.         handle.write('<?xml version="1.0" encoding="iso-8859-1"?>\n<html>\n   <head>\n <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />\n   <title>H\xe4ppy Birthday</title>\n   </head>\n   <body>\n   <a href="http://www.wccatv.com/files/video/H\xe4ppy.mov">H\xe4ppy Birthday</a>\n   </body>\n</html>')
  184.         handle.close()
  185.         dialogs.delegate = UnicodeTestDelegate()
  186.         dialogs.delegate.choice = dialogs.BUTTON_YES
  187.         myFeed = feed.Feed(u'file://' + self.filename)
  188.         self.assertEqual(dialogs.delegate.numCalls, 1)
  189.         myFeed.update()
  190.         if len(myFeed.items) > 0:
  191.             self.assertEqual(len(myFeed.items), 1)
  192.             myItem = myFeed.items[0]
  193.             myURL = myItem.getURL()
  194.             self.assertEqual(str(myURL), myURL)
  195.         
  196.  
  197.     
  198.     def testInvalidLatin1HTMLLinks(self):
  199.         (handle, self.filename) = mkstemp('.html')
  200.         handle = file(self.filename, 'wb')
  201.         handle.write('<?xml version="1.0" encoding="iso-8859-1"?>\n<html>\n   <head>\n       <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />\n      <title>H\xc3\xa4ppy Birthday</title>\n   </head>\n   <body>\n   <a href="http://www.wccatv.com/files/video/H\xc3\xa4ppy.mov">H\xc3\xa4ppy Birthday</a>\n   </body>\n</html>')
  202.         handle.close()
  203.         dialogs.delegate = UnicodeTestDelegate()
  204.         dialogs.delegate.choice = dialogs.BUTTON_YES
  205.         myFeed = feed.Feed(u'file://' + self.filename)
  206.         self.assertEqual(dialogs.delegate.numCalls, 1)
  207.         myFeed.update()
  208.         if len(myFeed.items) > 0:
  209.             self.assertEqual(len(myFeed.items), 1)
  210.             myItem = myFeed.items[0]
  211.             myURL = myItem.getURL()
  212.             self.assertEqual(str(myURL), myURL)
  213.         
  214.  
  215.     
  216.     def testUTF8HTMLThumbs(self):
  217.         (handle, self.filename) = mkstemp('.html')
  218.         handle = file(self.filename, 'wb')
  219.         handle.write('<?xml version="1.0" encoding="utf-8"?>\n<html>\n   <head>\n <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />\n      <title>H\xc3\xa4ppy Birthday</title>\n   </head>\n   <body>\n   <a href="http://www.wccatv.com/files/video/hbml.mov"><img src="http://www.wccatv.com/files/video/H\xc3\xa4ppy.png"/>H\xc3\xa4ppy Birthday</a>\n   </body>\n</html>')
  220.         handle.close()
  221.         dialogs.delegate = UnicodeTestDelegate()
  222.         dialogs.delegate.choice = dialogs.BUTTON_YES
  223.         myFeed = feed.Feed(u'file://' + self.filename)
  224.         self.assertEqual(dialogs.delegate.numCalls, 1)
  225.         myFeed.update()
  226.         self.assertEqual(len(myFeed.items), 1)
  227.         myItem = myFeed.items[0]
  228.         myURL = myItem.getURL()
  229.         self.assertEqual(str(myURL), myURL)
  230.         thumb = myItem.getThumbnailURL()
  231.         if thumb is not None:
  232.             self.assertEqual(str(thumb), thumb)
  233.         
  234.  
  235.     
  236.     def testLatin1HTMLThumbs(self):
  237.         (handle, self.filename) = mkstemp('.html')
  238.         handle = file(self.filename, 'wb')
  239.         handle.write('<?xml version="1.0" encoding="iso-8859-1"?>\n<html>\n   <head>\n  <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />\n    <title>H\xe4ppy Birthday</title>\n   </head>\n   <body>\n   <a href="http://www.wccatv.com/files/video/hbml.mov"><img src="http://www.wccatv.com/files/video/H\xe4ppy.png"/>H\xe4ppy Birthday</a>\n   </body>\n</html>')
  240.         handle.close()
  241.         dialogs.delegate = UnicodeTestDelegate()
  242.         dialogs.delegate.choice = dialogs.BUTTON_YES
  243.         myFeed = feed.Feed(u'file://' + self.filename)
  244.         self.assertEqual(dialogs.delegate.numCalls, 1)
  245.         myFeed.update()
  246.         self.assertEqual(len(myFeed.items), 1)
  247.         myItem = myFeed.items[0]
  248.         myURL = myItem.getURL()
  249.         self.assertEqual(str(myURL), myURL)
  250.         thumb = myItem.getThumbnailURL()
  251.         if thumb is not None:
  252.             self.assertEqual(str(thumb), thumb)
  253.         
  254.  
  255.     
  256.     def testInvalidLatin1HTMLThumbs(self):
  257.         (handle, self.filename) = mkstemp('.html')
  258.         handle = file(self.filename, 'wb')
  259.         handle.write('<?xml version="1.0" encoding="iso-8859-1"?>\n<html>\n   <head>\n       <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />\n <title>H\xc3\xa4ppy Birthday</title>\n   </head>\n   <body>\n   <a href="http://www.wccatv.com/files/video/hbml.mov"><img src="http://www.wccatv.com/files/video/H\xc3\xa4ppy.png"/>H\xc3\xa4ppy Birthday</a>\n   </body>\n</html>')
  260.         handle.close()
  261.         dialogs.delegate = UnicodeTestDelegate()
  262.         dialogs.delegate.choice = dialogs.BUTTON_YES
  263.         myFeed = feed.Feed(u'file://' + self.filename)
  264.         self.assertEqual(dialogs.delegate.numCalls, 1)
  265.         myFeed.update()
  266.         self.assertEqual(len(myFeed.items), 1)
  267.         myItem = myFeed.items[0]
  268.         myURL = myItem.getURL()
  269.         self.assertEqual(str(myURL), myURL)
  270.         thumb = myItem.getThumbnailURL()
  271.         if thumb is not None:
  272.             self.assertEqual(str(thumb), thumb)
  273.         
  274.  
  275.     
  276.     def testDemocracyNowBug(self):
  277.         url = resources.url('testdata/democracy-now-unicode-bug.xml')
  278.         myFeed = feed.Feed(url)
  279.         self.forceFeedParserCallback(myFeed)
  280.         for item in myFeed.items:
  281.             u'booya' in item.getTitle().lower()
  282.         
  283.  
  284.     
  285.     def testGetText(self):
  286.         oldLang = None
  287.         
  288.         try:
  289.             oldLang = os.environ['LANGUAGE']
  290.         except:
  291.             pass
  292.  
  293.         os.environ['LANGUAGE'] = 'fr'
  294.         gtcache._gtcache = { }
  295.         gettext.bindtextdomain('miro', resources.path('../../locale'))
  296.         gettext.textdomain('miro')
  297.         gettext.bind_textdomain_codeset('miro', 'UTF-8')
  298.         self.assertEqual(gtcache.gettext('Settings'), u'R├⌐glages')
  299.         if oldLang is None:
  300.             del os.environ['LANGUAGE']
  301.         else:
  302.             os.environ['LANGUAGE'] = oldLang
  303.  
  304.     
  305.     def testTemplates(self):
  306.         oldLang = None
  307.         
  308.         try:
  309.             oldLang = os.environ['LANGUAGE']
  310.         except:
  311.             pass
  312.  
  313.         os.environ['LANGUAGE'] = 'fr'
  314.         gtcache._gtcache = { }
  315.         gettext.bindtextdomain('miro', resources.path('../../locale'))
  316.         gettext.textdomain('miro')
  317.         gettext.bind_textdomain_codeset('miro', 'UTF-8')
  318.         out = template.fillStaticTemplate('unittest/simpleunicode', 'gtk-x11', 'noCookie')
  319.         self.assert_(type(out) == types.UnicodeType)
  320.         self.assert_(out.find(u'<h1>H├â┬ñppy Birthday</h1>') == -1)
  321.         self.assert_(out.find(u'<p>R├â┬⌐glages</p>') == -1)
  322.         self.assert_(out.find(u'<h1>H├ñppy Birthday</h1>') != -1)
  323.         self.assert_(out.find(u'<p>R├⌐glages</p>') != -1)
  324.         if oldLang is None:
  325.             del os.environ['LANGUAGE']
  326.         else:
  327.             os.environ['LANGUAGE'] = oldLang
  328.  
  329.  
  330.  
  331. class TemplateCompilerTest(framework.DemocracyTestCase):
  332.     
  333.     def testNonUnicode(self):
  334.         self.assertRaises(util.DemocracyUnicodeError, (lambda : template_compiler.genRepeatText('out', '123', '    ', 'boo')))
  335.         self.assertRaises(util.DemocracyUnicodeError, (lambda : template_compiler.genRepeatText('out', '123', '    ', 'Chinese Numbers %cbN00N8cN09VdbN94Q6dN03Q6bN5d')))
  336.         self.assertEqual(u"    out.write(u'Chinese Numbers \\u25cb\\u4e00\\u4e8c\\u4e09\\u56db\\u4e94\\u516d\\u4e03\\u516b\\u4e5d')\n", template_compiler.genRepeatText('out', '123', '    ', u'Chinese Numbers ΓùïΣ╕ÇΣ║îΣ╕ëσ¢¢Σ║öσà¡Σ╕âσà½Σ╣¥'))
  337.         self.assertRaises(util.DemocracyUnicodeError, (lambda : template_compiler.genRepeatTranslate('out', '123', '    ', ('boo', { }))))
  338.         self.assertRaises(util.DemocracyUnicodeError, (lambda : template_compiler.genRepeatTranslate('out', '123', '    ', ('Chinese Numbers %cbN00N8cN09VdbN94Q6dN03Q6bN5d', { }))))
  339.         self.assertRaises(util.DemocracyUnicodeError, (lambda : template_compiler.genRepeatTextHide('out', '123', '    ', (False, 'boo'))))
  340.         self.assertRaises(util.DemocracyUnicodeError, (lambda : template_compiler.genRepeatTextHide('out', '123', '    ', (False, 'Chinese Numbers %cbN00N8cN09VdbN94Q6dN03Q6bN5d'))))
  341.         self.assertRaises(util.DemocracyUnicodeError, (lambda : template_compiler.genRepeatTextHide('out', '123', '    ', (True, 'boo'))))
  342.         self.assertRaises(util.DemocracyUnicodeError, (lambda : template_compiler.genRepeatTextHide('out', '123', '    ', (True, 'Chinese Numbers %cbN00N8cN09VdbN94Q6dN03Q6bN5d'))))
  343.         self.assertEqual(u"    if not (True):\n        out.write(u'Chinese Numbers \\u25cb\\u4e00\\u4e8c\\u4e09\\u56db\\u4e94\\u516d\\u4e03\\u516b\\u4e5d')\n", template_compiler.genRepeatTextHide('out', '123', '    ', (True, u'Chinese Numbers ΓùïΣ╕ÇΣ║îΣ╕ëσ¢¢Σ║öσà¡Σ╕âσà½Σ╣¥')))
  344.         self.assertRaises(util.DemocracyUnicodeError, (lambda : template_compiler.genHideSection('out', '123', '    ', (False, [
  345. ((lambda a, b, c, d: 'boo'), 'ignored')]))
  346. ))
  347.         self.assertRaises(util.DemocracyUnicodeError, (lambda : template_compiler.genHideSection('out', '123', '    ', (False, [
  348. ((lambda a, b, c, d: 'Chinese Numbers %cbN00N8cN09VdbN94Q6dN03Q6bN5d'), 'ignored')]))
  349. ))
  350.         self.assertEqual(u'    if not (False):\nChinese Numbers ΓùïΣ╕ÇΣ║îΣ╕ëσ¢¢Σ║öσà¡Σ╕âσà½Σ╣¥', template_compiler.genHideSection('out', '123', '    ', (False, [
  351.             ((lambda a, b, c, d: u'Chinese Numbers ΓùïΣ╕ÇΣ║îΣ╕ëσ¢¢Σ║öσà¡Σ╕âσà½Σ╣¥'), 'ignored')])))
  352.         self.assertRaises(util.DemocracyUnicodeError, (lambda : template_compiler.genQuoteAndFillAttr('out', '123', '    ', 'boo')))
  353.         self.assertRaises(util.DemocracyUnicodeError, (lambda : template_compiler.genQuoteAndFillAttr('out', '123', '    ', 'Chinese Numbers %cbN00N8cN09VdbN94Q6dN03Q6bN5d')))
  354.         self.assertEqual(u"    out.write(quoteAndFillAttr(u'Chinese Numbers \\u25cb\\u4e00\\u4e8c\\u4e09\\u56db\\u4e94\\u516d\\u4e03\\u516b\\u4e5d',locals()))\n", template_compiler.genQuoteAndFillAttr('out', '123', '    ', u'Chinese Numbers ΓùïΣ╕ÇΣ║îΣ╕ëσ¢¢Σ║öσà¡Σ╕âσà½Σ╣¥'))
  355.  
  356.  
  357.